package com.techysky.service.impl;

import java.io.File;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import com.techysky.entity.Project;
import com.techysky.repository.ProjectRepository;
import com.techysky.service.ProjectService;
import com.techysky.service.XmlService;
import com.techysky.util.FileUtil;
import com.techysky.util.ZipUtil;

/**
 * 
 * @author nichao
 * @date 2017年7月14日 上午9:34:07
 * @remark 业务实现类
 */
@Service("projectService")
public class ProjectServiceImpl implements ProjectService {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static final Log log=LogFactory.getLog(ProjectServiceImpl.class);
	//dm文件压缩包存放的路径，该目录下只允许有一个zip文件包,
	@Autowired
	private Environment env;
	@Autowired
	private XmlService xmlService;
	@Autowired
	private ProjectRepository projectRepository;
	
	@Override
	public Project saveOrUpdate(Project project) {
		return this.projectRepository.save(project);
	}
	
	@Override
	public void initProject() {
		//29项目存在2个zip项目包，zip对应的项目包是完整项目包，zip1对应的项目包只包含另一个适用性数据包
		//首先判断项目表中有几条数据，如果有两条，说明数据已存在，如果数据zip修改时间发生改变，则从新解析数据包，否则不处理，如果没有数据则该数据有问题
		int count = this.projectRepository.countByCode("IETM");
		Project project = count>0?this.projectRepository.findByCode("IETM").get(0):new Project();
		File file=new File(env.getProperty("zip"));
		if(file.exists()) {
			if(!ObjectUtils.isEmpty(project.getZipTime())) {
				if(project.getZipTime()!=file.lastModified()) {//如果项目存在且zip包时间和数据库中存储时间不一样，则需要重新解析
					project.setZipTime(file.lastModified());
					parseProject(file,project);//解析项目包
				}
			}else {//新项目需要从新解析
				project.setCode("IETM");
				project.setZipTime(file.lastModified());
				parseProject(file,project);
			}
		}else{
			log.info("item数据包不存在");
		}
		this.projectRepository.save(project);
	}
	
	@Override
	public Object getProjects() {
		return this.projectRepository.findAll();
	}

	
	/**
	 * 解析项目包，xml转成html处理
	 * 1、解压缩zip项目数据包，创建临时解压 
	 * IetmFileUtils.zipToFile(zip, xmlPath);
	 * 2、删除项目包
	 * 3、解析入库
	 * 4、将xml转换成html,该过程可以省略直接将xml添加xsl样式动态渲染
	 * 5、删除解压包
	 * @param zip
	 * @param project
	 */
	public void parseProject(File zip,Project project) {
		ZipUtil.upzipFile(zip,null);//如果不传参数 默认解压到window临时文件夹下，将文件加压缩到改目录下System.getProperty("java.io.tmpdir")+\\压缩文件名\\
		File unZipFolder = new File(System.getProperty("java.io.tmpdir")+"\\IETM\\");
		zip.delete();//删除文件项目包
		this.xmlService.parse(unZipFolder,project.getId());//解析dm数据入库，以DMC-开头的xml文件
		FileUtil.deleteDirectory(unZipFolder);//删除解压
	}
	
	/**
	 * 解析项目包，不将xml转成html
	 * 1、解压缩zip项目数据包，将文件解压到配置的html文件夹下
	 * 2、删除项目包
	 * 3、解析入库
	 * @param zip
	 * @param project
	 */
	public void parsePro(File zip,Project project) {
		ZipUtil.upzipFile(zip,env.getProperty("html.path"));//将文件加压缩到改目录下System.getProperty("java.io.tmpdir")+\\压缩文件名\\此处的xml+xsl 转成html 特别注意，如果xml文件后缀为大写就无法转化，所以需要在解压过程中转成小写
		File unZipFolder = new File(env.getProperty("html.path"));//
		zip.delete();//删除文件项目包
		this.xmlService.parse(unZipFolder,project.getId());//解析dm数据入库，以DMC-开头的xml文件
	}
	
}

